/**led.c**/
 
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
// LED Pin - wiringPi pin 3 is BCM_GPIO 22.(physical 15)
// LED引脚设置 - 使用wiringPi库中的GPIO引脚3（对应于BCM编号22，物理编号15）。
 
int main() {
    int pin;
    
    // 设置响应头部    // 设置HTTP响应头部，指出随后的内容是HTML文本。
    printf("Content-type:text/html\n\n");      
 
    // 输出HTML代码来构建一个简单的网页界面，告诉用户LED状态已设置，并提供一个返回链接。
    printf("<html>\n");
    printf("<head><title>cgi control led web</title></head>\n");
    printf("<body>\n");
    printf("<p>led is setted successful! you can watch the led's change</p >\n");
    printf("<p><a href= \"http://192.168.137.53/led.html\" ><button>get back</button></a ></p >\n");
    printf("</body>\n");
    printf("</html>\n");
 
    // 获取CGI的URL参数   // 获取环境变量QUERY_STRING，它包含了浏览器发送的查询字符串。
    char *query_string = getenv("QUERY_STRING");   
 
    // 解析URL参数     // 解析查询字符串，提取led_num和led_state的值。如果解析失败，则输出错误信息并退出。
    int led_num;
    int led_state;
    if(sscanf(query_string, "led_num=%d&led_state=%d", &led_num, &led_state) != 2)
    {
      printf("<p>please input right</p >");
      return 0;
    }
 
// 初始化wiringPi库。如果设置失败，则输出错误信息并退出。
    if(wiringPiSetup() < 0){
        printf("wiringPi setup failed.\n");
        return 1;
    }
 
    // 控制LED1的亮灭状态
    // 根据传递的led_num参数，设置对应的GPIO引脚为输出模式，以控制连接到该引脚的LED灯。
    // 将LED编号转换为Wiring Pi的GPIO引脚编号
    switch (led_num) {
        case 2: pin = 3; break; // LED2连接到GPIO3
        case 3: pin = 2; break; // LED3连接到GPIO2
        // ... 可以根据实际情况添加更多LED的映射
        default: 
            printf("<p>Please input 2<=led_num<=5!</p >");
            return 0;
    }
    pinMode(pin,OUTPUT);
 
    if (led_state == 1) {
        digitalWrite(pin, HIGH); // 打开LED
        printf("<p>LED %d is on.</p >", led_num);
    } else {
        digitalWrite(pin, LOW); // 关闭LED
        printf("<p>LED %d is off.</p >", led_num);
    }
 
    printf("</html>\n");
    return 0;
}